<html>
<head>
  <title>Evernote Export</title>
  <basefont face="微软雅黑" size="2" />
  <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
  <meta name="exporter-version" content="YXBJ Windows/600753 (zh-CN, DDL); Windows/10.0.0 (Win64);"/>
  <style>
    body, td {
      font-family: 微软雅黑;
      font-size: 10pt;
    }
  </style>
</head>
<body>
<a name="888"/>

<div>
<span><div>OpenCV侵蚀与膨胀</div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255);"><span style="box-sizing: border-box; outline: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(255, 255, 255); color: rgb(77, 77, 77); font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; font-variant-caps: normal; font-variant-ligatures: normal; line-height: 26px;">erode(const Mat &amp;src, Mat &amp;dst, Mat kernel, Point anchor=Point(-1,-1), int iterations=1)</span></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; list-style-type: disc; overflow-wrap: break-word; text-align: start;"><span style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif;">src：輸入圖，可以多通道，深度可為CV_8U、CV_16U、CV_16S、CV_32F或CV_64F。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; list-style-type: disc; overflow-wrap: break-word; text-align: start;"><span style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif;">dst：輸出圖，和輸入圖尺寸、型態相同。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; list-style-type: disc; overflow-wrap: break-word; text-align: start;"><span style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif;">kernel：結構元素，如果kernel=Mat()則為預設的3×3矩形，越大侵蝕效果越明顯。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; list-style-type: disc; overflow-wrap: break-word; text-align: start;"><span style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif;">anchor：原點位置，預設為結構元素的中央。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="box-sizing: border-box; outline: 0px; overflow-wrap: break-word; font-size: 16px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif;">iterations：執行次數，預設為1次，執行越多次侵蝕效果越明顯。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;">腐蚀与膨胀的函数使用方法相同，只是调用参数不同。</span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;">腐蚀erode 膨胀dilate</span></div><div style="text-align: start;"><span style="font-size: 12pt;">腐蚀原理：</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">1.假设原图像中有一个前景物体，那么我们用一个结构元素去腐蚀原图的过程是这样的：遍历原图像的每一个像素，然后用结构元素的中心点对准当前正在遍历的这个像素，然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值，用这个最小值替换当前像素值。</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">2.二值图像前景物体为1，背景为0.假设原图像中有一个前景物体，那么我们用一个结构元素去腐蚀原图的过程是这样的：遍历原图像的每一个像素，然后用结构元素的中心点对准当前正在遍历的这个像素，然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最小值，用这个最小值替换当前像素值。由于二值图像最小值就是0，所以就是用0替换，即变成了黑色背景。从而也可以看出，如果当前结构元素覆盖下，全部都是背景，那么就不会对原图做出改动，因为都是0.如果全部都是前景像素，也不会对原图做出改动，因为都是1.只有结构元素位于前景物体边缘的时候，它覆盖的区域内才会出现0和1两种不同的像素值，这个时候把当前像素替换成0就有变化了。因此腐蚀看起来的效果就是让前景物体缩小了一圈一样。对于前景物体中一些细小的连接处，如果结构元素大小相等，这些连接处就会被断开。</span></div><div style="text-align: start;"><br/></div><div style="text-align: start;"><span style="font-size: 12pt;">膨胀原理与这个原理正好相反。</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">膨胀原理：</span></div><div style="text-align: start;"><span style="font-size: 12pt;">1.</span><span style="font-size: 12pt;">二值图像前景物体为1，背景为0.假设原图像中有一个前景物体，那么我们用一个结构元素去膨胀原图的过程是这样的：遍历原图像的每一个像素，然后用结构元素的中心点对准当前正在遍历的这个像素，然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值，用这个最大值替换当前像素值。由于二值图像最大值就是1，所以就是用1替换，即变成了白色前景物体。从而也可以看出，如果当前结构元素覆盖下，全部都是背景，那么就不会对原图做出改动，因为都是0.如果全部都是前景像素，也不会对原图做出改动，因为都是1.只有结构元素位于前景物体边缘的时候，它覆盖的区域内才会出现0和1两种不同的像素值，这个时候把当前像素替换成1就有变化了。因此膨胀看起来的效果就是让前景物体胀大了一圈一样。对于前景物体中一些细小的断裂处，如果结构元素大小相等，这些断裂的地方就会被连接起来。</span></div><div style="text-align: start;"><br/></div><div style="text-align: start;"><span style="font-size: 12pt;">2.假设原图像中有一个前景物体，那么我们用一个结构元素去膨胀原图的过程是这样的：遍历原图像的每一个像素，然后用结构元素的中心点对准当前正在遍历的这个像素，然后取当前结构元素所覆盖下的原图对应区域内的所有像素的最大值，用这个最大值替换当前像素值。</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 12pt;"><a href="https://blog.csdn.net/qq_25847123/article/details/73744575" style="font-size: 12pt;">https://blog.csdn.net/qq_25847123/article/details/73744575</a></span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br/></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 12pt;">getStructuringElement 函数</span></div><div style="text-align: start;"><span style="font-size: 12pt;">getStructuringElement函数会返回指定形状和尺寸的结构元素。</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">Mat getStructuringElement(int shape, Size esize, Point anchor = Point(-1, -1));</span></div><div style="text-align: start;"><span style="font-size: 12pt;">这个函数的第一个参数表示内核的形状，有三种形状可以选择。</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">矩形：MORPH_RECT;</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">交叉形：MORPH_CROSS;</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">椭圆形：MORPH_ELLIPSE;</span></div><div style="text-align: start;"><span style="font-size: 12pt;"><br/></span></div><div style="text-align: start;"><span style="font-size: 12pt;">第二和第三个参数分别是内核的尺寸以及锚点的位置。一般在调用erode以及dilate函数之前，先定义一个Mat类型的变量来获得getStructuringElement函数的返回值。对于锚点的位置，有默认值Point（-1,-1），表示锚点位于中心点。element形状唯一依赖锚点位置，其他情况下，锚点只是影响了形态学运算结果的偏移。</span></div><div style="text-align: start;"><br/></div><div style="text-align: start;"><br/></div><div style="text-align: start;"><br/></div><div style="box-sizing: border-box; padding: 8px; font-family: Monaco, Menlo, Consolas, &quot;Courier New&quot;, monospace; font-size: 12px; color: rgb(51, 51, 51); border-radius: 4px; background-color: rgb(251, 250, 248); border: 1px solid rgba(0, 0, 0, 0.15);-en-codeblock:true;"><div>Mat image = imread(&quot;A.jpg&quot;);</div><div>        imshow(&quot;原图&quot;, image);</div><div>        Mat rect = getStructuringElement(MORPH_RECT, Size(15, 15));</div><div>        Mat ShowImage;</div><div>        erode(image, ShowImage, rect);</div><div>        imshow(&quot;效果图&quot;, ShowImage);</div><div>        waitKey(0);</div></div><div style="text-align: start;"><br/></div><div style="text-align: start;"><br/></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 12pt;"><br/></span></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><br/></div><div style="box-sizing: border-box; outline: 0px; margin: 0px 0px 16px; padding: 0px; font-size: 16px; overflow-x: auto; overflow-wrap: break-word; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px;"><span style="font-size: 16px;"><br/></span></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; list-style-type: disc; overflow-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; list-style-type: disc; overflow-wrap: break-word;"></div><div style="box-sizing: border-box; outline: 0px; margin: 8px 0px 0px 32px; padding: 0px; font-family: &quot;Microsoft YaHei&quot;, &quot;SF Pro Display&quot;, Roboto, Noto, Arial, &quot;PingFang SC&quot;, sans-serif; list-style-type: disc; overflow-wrap: break-word;"></div></span>
</div></body></html> 